package com.summer.filesync.security;

/** 认证结果类 封装用户认证的结果信息 */
public class AuthenticationResult {
  private final boolean success;
  private final String token;
  private final User user;
  private final String errorMessage;

  private AuthenticationResult(boolean success, String token, User user, String errorMessage) {
    this.success = success;
    this.token = token;
    this.user = user;
    this.errorMessage = errorMessage;
  }

  /**
   * 创建成功的认证结果
   *
   * @param token 认证令牌
   * @param user 用户信息
   * @return 认证结果
   */
  public static AuthenticationResult success(String token, User user) {
    return new AuthenticationResult(true, token, user, null);
  }

  /**
   * 创建失败的认证结果
   *
   * @param errorMessage 错误信息
   * @return 认证结果
   */
  public static AuthenticationResult failure(String errorMessage) {
    return new AuthenticationResult(false, null, null, errorMessage);
  }

  /**
   * 检查认证是否成功
   *
   * @return 是否成功
   */
  public boolean isSuccess() {
    return success;
  }

  /**
   * 获取认证令牌
   *
   * @return 令牌，如果认证失败返回null
   */
  public String getToken() {
    return token;
  }

  /**
   * 获取用户信息
   *
   * @return 用户信息，如果认证失败返回null
   */
  public User getUser() {
    return user;
  }

  /**
   * 获取错误信息
   *
   * @return 错误信息，如果认证成功返回null
   */
  public String getErrorMessage() {
    return errorMessage;
  }

  /**
   * 获取用户角色
   *
   * @return 用户角色，如果认证失败返回ANONYMOUS
   */
  public UserRole getRole() {
    return user != null ? user.getRole() : UserRole.ANONYMOUS;
  }

  /**
   * 获取用户名
   *
   * @return 用户名，如果认证失败返回null
   */
  public String getUsername() {
    return user != null ? user.getUsername() : null;
  }

  /**
   * 检查是否有指定权限
   *
   * @param requiredRole 所需角色
   * @return 是否有权限
   */
  public boolean hasPermission(UserRole requiredRole) {
    return success && getRole().hasPermission(requiredRole);
  }

  /**
   * 检查是否有指定权限级别
   *
   * @param requiredLevel 所需权限级别
   * @return 是否有权限
   */
  public boolean hasPermission(int requiredLevel) {
    return success && getRole().hasPermission(requiredLevel);
  }

  @Override
  public String toString() {
    if (success) {
      return String.format(
          "AuthenticationResult{success=true, username='%s', role=%s}", getUsername(), getRole());
    } else {
      return String.format("AuthenticationResult{success=false, error='%s'}", errorMessage);
    }
  }
}
